package com.hbird.service.impl;

import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hbird.entity.TUser;
import com.hbird.mapper.TUserMapper;
import com.hbird.service.TUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Field;
import java.util.List;

@Service
public class TUserServiceImpl implements TUserService {

    private static Logger LOGGER = LoggerFactory.getLogger(TUserServiceImpl.class);

    @Autowired
    TUserMapper tsUserMapper ;

    @Override
    public int addUser(TUser user) {
        return tsUserMapper.insertSelective(user);
    }

    /*
   * 这个方法中用到了我们开头配置依赖的分页插件pagehelper
   * 很简单，只需要在service层传入参数，然后将参数传递给一个插件的一个静态方法即可；
   * pageNum 开始页数
   * pageSize 每页显示的数据条数
   * */
    @Override
    public List<TUser> findAllUser(int pageNum, int pageSize) {

        //引入分页查询，使用PageHelper分页功能
        //在查询之前传入当前页号和每页显示多少记录
        PageHelper.startPage(pageNum, pageSize);
        //startPage后紧跟的这个查询就是分页查询
        //注意：都是与查询方法紧挨着的，不要中间夹杂其它无关语句
        List<TUser> ltu = tsUserMapper.selectAllUser();
        //使用PageInfo包装查询结果，只需要将pageInfo交给页面就可以
        PageInfo pageInfo = new PageInfo<>(ltu,5);
        //pageINfo封装了分页的详细信息，也可以指定连续显示的页数

        return ltu;
    }

    @Override
    public List<TUser> listAllUser() {
        LOGGER.info("---info---");
        LOGGER.debug("---debug---");
        LOGGER.error("---error---");
        return tsUserMapper.listAllUser();
    }

    @Override
    public List<TUser> findByUsername(String name) {
        getResultsStr(TUser.class);
        return tsUserMapper.findByUsername(name);
    }

    /**
     * 1.用于获取结果集的映射关系
     */
    public static String getResultsStr(Class origin) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("@Results({\n");
        for (Field field : origin.getDeclaredFields()) {
            String property = field.getName();
            //映射关系：对象属性(驼峰)->数据库字段(下划线)
            String column = new PropertyNamingStrategy.SnakeCaseStrategy().translate(field.getName()).toUpperCase();
            stringBuilder.append(String.format("@Result(property = \"%s\", column = \"%s\"),\n", property, column));
        }
        stringBuilder.append("})");
        return stringBuilder.toString();
    }

}